﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;

namespace Server.Network
{
    /// <summary>
    /// File Download Queue를 관리하기 위한 방법을 제공합니다.
    /// </summary>
    public static class FDQManager
    {
        /// <summary>
        /// File Download Queue를 제공합니다.
        /// </summary>
        public class FDQ
        {
            /// <summary>
            /// 파일 다운로드 요청을 한 접속 클라이언트를 위한 Pool ID를 가져옵니다.
            /// </summary>
            public int PoolId { get; private set; }

            /// <summary>
            /// 전송할 FileList
            /// </summary>
            private Queue<ManagedFile> m_filePathList = new Queue<ManagedFile>();

            /// <summary>
            /// 새로운 FDQ를 생성합니다.
            /// </summary>
            /// <param name="poolId"></param>
            public FDQ(int poolId)
            {
                PoolId = poolId;
            }

            /// <summary>
            /// 전송할 파일을 Push합니다.
            /// </summary>
            /// <param name="file"></param>
            public void PushFilePath(ManagedFile file)
            {
                m_filePathList.Enqueue(file);
            }

            /// <summary>
            /// 전송할 파일을 Pop합니다.
            /// </summary>
            /// <returns></returns>
            public ManagedFile PopFilePath()
            {
                return m_filePathList.Dequeue();
            }
        }

        /// <summary>
        /// 파일 다운로드 Pool 리스트
        /// </summary>
        static Dictionary<int, FDQ> FTQList = new Dictionary<int, FDQ>();
        
        /// <summary>
        /// 관리되는 최종 Pool ID
        /// </summary>
        static int AutoPoolId = 0;

        /// <summary>
        /// 새로운 FDQ를 할당하고 할당된 Pool ID를 반환합니다.
        /// </summary>
        /// <returns>할당된 Pool ID</returns>
        static public int Allocate()
        {
            int poolId;

            poolId = ++AutoPoolId;

            FDQ ftq = new FDQ(poolId);

            FTQList.Add(poolId, ftq);

            return poolId;
        }

        /// <summary>
        /// 할당된 FDQ를 가져옵니다.
        /// </summary>
        /// <param name="poolId">가져오고자 하는 Pool ID</param>
        /// <returns>File Download Queue</returns>
        static public FDQ GetFDQ(int poolId)
        {
            return FTQList[poolId];
        }
    }
}
